🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / docs / src / commonMain / kotlin / org / meshtastic / feature / docs / data / DocBundleLoader.kt
Displaying Raw • Download
feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/data/DocBundleLoader.kt bf929c20f274232e0eb8ddc19b2dc82403e99e5b (bf929c20) Text, 23.44 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.docs.data
Tff7b72import T7ee787meshtasticandroid.feature.docs.generated.resources.Res
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.getString
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.core.common.util.currentLocaleQualifier
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_android_auto
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_app_functions
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_connections
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_debug_logs
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_desktop
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_discovery
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_firmware
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_help
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_map
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_messages
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_mqtt
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_node_metrics
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_nodes
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_onboarding
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_settings_module
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_settings_radio
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_signal_meter
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_tak
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_telemetry
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_translate
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_units
Tff7b72import T7ee787org.meshtastic.core.resources.doc_keywords_widget
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_android_auto
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_app_functions
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_connections
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_debug_logs
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_desktop
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_discovery
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_firmware
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_help
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_map
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_messages
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_mqtt
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_node_metrics
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_nodes
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_onboarding
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_settings_module
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_settings_radio
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_signal_meter
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_tak
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_telemetry
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_translate
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_units
Tff7b72import T7ee787org.meshtastic.core.resources.doc_title_widget
Tff7b72import T7ee787org.meshtastic.feature.docs.model.DocBundle
Tff7b72import T7ee787org.meshtastic.feature.docs.model.DocPage
Tff7b72import T7ee787org.meshtastic.feature.docs.model.DocPageContent
Tff7b72import T7ee787org.meshtastic.feature.docs.model.DocSection
Tff7b72import T7ee787org.meshtastic.feature.docs.model.KeywordIndexEntry
Tff7b72import T7ee787org.meshtastic.core.resources.Res Tff7b72as Te6edf3CoreRes
T8b949e/** Interface for loading the packaged docs bundle. */
Tff7b72interface T56d364DocBundleLoader Tb4b4b4{
Tff7b72suspend Tff7b72fun Td2a8ffloadTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3DocBundle
Tff7b72suspend Tff7b72fun Td2a8ffreadPageTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3DocPageContent?
T8b949e/** Check whether a Crowdin-translated resource exists for the given page and locale. */
Tff7b72suspend Tff7b72fun Td2a8ffhasTranslatedResourceTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localeTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean
Tff7b72fun Td2a8ffpagesBySectionTb4b4b4(Te6edf3sectionTb4b4b4: Te6edf3DocSectionTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>
Tb4b4b4}
T8b949e/**
* Default implementation that loads docs from bundled markdown files packaged as Compose Resources under `files/docs/`.
*
* User guide titles and keywords are resolved from string resources so Crowdin translations propagate to the in-app
* index and search. Developer guide entries stay hardcoded English (code-focused audience).
*
* No cross-locale caching — the bundle rebuilds on each [load] call (~1 ms) so locale changes take effect immediately.
*/
Tf0883e@SingleTb4b4b4(Te6edf3binds Tff7b72= Tff7b72[Te6edf3DocBundleLoaderTff7b72::Te6edf3classTff7b72]Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72class T56d364DefaultDocBundleLoader Tb4b4b4: Te6edf3DocBundleLoader Tb4b4b4{
Tff7b72private Tff7b72var Te6edf3lastPagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3FRONTMATTER_DELIMITER Tff7b72= Ta5d6ff"Ta5d6ff---Ta5d6ff"
Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffloadTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3DocBundle Tb4b4b4{
Tff7b72val Te6edf3entries Tff7b72= Te6edf3buildUserGuideIndexTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3buildDeveloperGuideIndexTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3pages Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toDocPageTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3lastPages Tff7b72= Te6edf3pages
Tff7b72return Te6edf3DocBundleTb4b4b4(
Te6edf3pages Tff7b72= Te6edf3pagesTb4b4b4,
Te6edf3pageIndex Tff7b72= Te6edf3pagesTb4b4b4.Te6edf3associateBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4,
Te6edf3bundleVersion Tff7b72= Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4,
Te6edf3generatedAt Tff7b72= Ta5d6ff"Ta5d6ff2026-05-07T00:00:00ZTa5d6ff"Tb4b4b4,
Te6edf3totalBytes Tff7b72= T79c0ff0LTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffreadPageTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3DocPageContent? Tb4b4b4{
Tff7b72val Te6edf3bundle Tff7b72= Te6edf3loadTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3page Tff7b72= Te6edf3bundleTb4b4b4.Te6edf3pageIndexTff7b72[Te6edf3pageIdTff7b72] Tff7b72?: Tff7b72return Tff7b72null
Tff7b72val Te6edf3markdown Tff7b72= Te6edf3loadMarkdownContentTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72return Te6edf3DocPageContentTb4b4b4(Te6edf3page Tff7b72= Te6edf3pageTb4b4b4, Te6edf3markdown Tff7b72= Te6edf3markdownTb4b4b4, Te6edf3cssPath Tff7b72= Tff7b72nullTb4b4b4)
Tb4b4b4}
T8b949e/**
* Load page content with locale awareness. Tries locale-qualified Crowdin resource first, falls back to English.
* Returns a pair of (content, wasLocalized) for cascade decision.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffReturnCountTa5d6ff"Tb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffreadPageLocalizedTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localeTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Te6edf3DocPageContent?Tb4b4b4, Tffa657BooleanTff7b72> Tb4b4b4{
Tff7b72val Te6edf3bundle Tff7b72= Te6edf3loadTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3page Tff7b72= Te6edf3bundleTb4b4b4.Te6edf3pageIndexTff7b72[Te6edf3pageIdTff7b72] Tff7b72?: Tff7b72return Tff7b72null Te6edf3to Tff7b72false
Tff7b72if Tb4b4b4(Te6edf3locale Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ffenTa5d6ff"Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3localizedMarkdown Tff7b72= Te6edf3loadLocalizedMarkdownContentTb4b4b4(Te6edf3pageTb4b4b4, Te6edf3localeTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3localizedMarkdown Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3DocPageContentTb4b4b4(Te6edf3page Tff7b72= Te6edf3pageTb4b4b4, Te6edf3markdown Tff7b72= Te6edf3localizedMarkdownTb4b4b4, Te6edf3cssPath Tff7b72= Tff7b72nullTb4b4b4) Te6edf3to Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3markdown Tff7b72= Te6edf3loadMarkdownContentTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72return Te6edf3DocPageContentTb4b4b4(Te6edf3page Tff7b72= Te6edf3pageTb4b4b4, Te6edf3markdown Tff7b72= Te6edf3markdownTb4b4b4, Te6edf3cssPath Tff7b72= Tff7b72nullTb4b4b4) Te6edf3to Tff7b72false
Tb4b4b4}
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffloadLocalizedMarkdownContentTb4b4b4(Te6edf3pageTb4b4b4: Te6edf3DocPageTb4b4b4, Te6edf3localeTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String? Tb4b4b4{
Tff7b72val Te6edf3section Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3pageTb4b4b4.Te6edf3sectionTb4b4b4) Tb4b4b4{
Te6edf3DocSectionTb4b4b4.Te6edf3UserGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffuserTa5d6ff"
Te6edf3DocSectionTb4b4b4.Te6edf3DeveloperGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"
Tb4b4b4}
T8b949e// Try qualifiers in specificity order (mirrors Android resource resolution):
T8b949e// "pt-rBR" → "pt" → give up
Tff7b72for Tb4b4b4(Te6edf3qualifier Tff7b72in Te6edf3localeQualifiersTb4b4b4(Te6edf3localeTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3localePath Tff7b72= Ta5d6ff"Ta5d6fffiles/Tffd700$Te6edf3qualifierTa5d6ff/docs/Tffd700$Te6edf3sectionTa5d6ff/Tffd700${Te6edf3pageTb4b4b4.Te6edf3idTffd700}Ta5d6ff.mdTa5d6ff"
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3bytes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3localePathTb4b4b4)
Tff7b72return Te6edf3stripFrontmatterTb4b4b4(Te6edf3bytesTb4b4b4.Te6edf3decodeToStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffhasTranslatedResourceTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localeTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3bundle Tff7b72= Te6edf3loadTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3page Tff7b72= Te6edf3bundleTb4b4b4.Te6edf3pageIndexTff7b72[Te6edf3pageIdTff7b72] Tff7b72?: Tff7b72return Tff7b72false
Tff7b72val Te6edf3section Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3pageTb4b4b4.Te6edf3sectionTb4b4b4) Tb4b4b4{
Te6edf3DocSectionTb4b4b4.Te6edf3UserGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffuserTa5d6ff"
Te6edf3DocSectionTb4b4b4.Te6edf3DeveloperGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"
Tb4b4b4}
Tff7b72return Te6edf3localeQualifiersTb4b4b4(Te6edf3localeTb4b4b4)Tb4b4b4.Te6edf3any Tb4b4b4{ Te6edf3qualifier Tff7b72-Tff7b72>
Tff7b72val Te6edf3localePath Tff7b72= Ta5d6ff"Ta5d6fffiles/Tffd700$Te6edf3qualifierTa5d6ff/docs/Tffd700$Te6edf3sectionTa5d6ff/Tffd700${Te6edf3pageTb4b4b4.Te6edf3idTffd700}Ta5d6ff.mdTa5d6ff"
Tff7b72try Tb4b4b4{
Te6edf3ResTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3localePathTb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Produces CMP resource qualifier candidates in specificity order. Tries region-qualified first (e.g. "pt-rBR"),
* then language-only ("pt"). Deduplicates when device has no region (both would be "fr").
*/
Tff7b72private Tff7b72fun Td2a8fflocaleQualifiersTb4b4b4(Te6edf3languageTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tb4b4b4{
Tff7b72val Te6edf3fullQualifier Tff7b72= Te6edf3currentLocaleQualifierTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3buildList Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3fullQualifier Tff7b72!Tff7b72= Te6edf3languageTb4b4b4) Te6edf3addTb4b4b4(Te6edf3fullQualifierTb4b4b4)
Te6edf3addTb4b4b4(Te6edf3languageTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffloadMarkdownContentTb4b4b4(Te6edf3pageTb4b4b4: Te6edf3DocPageTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3section Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3pageTb4b4b4.Te6edf3sectionTb4b4b4) Tb4b4b4{
Te6edf3DocSectionTb4b4b4.Te6edf3UserGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffuserTa5d6ff"
Te6edf3DocSectionTb4b4b4.Te6edf3DeveloperGuide Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"
Tb4b4b4}
Tff7b72val Te6edf3resourcePath Tff7b72= Ta5d6ff"Ta5d6fffiles/docs/Tffd700$Te6edf3sectionTa5d6ff/Tffd700${Te6edf3pageTb4b4b4.Te6edf3idTffd700}Ta5d6ff.mdTa5d6ff"
Tff7b72return Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3bytes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3resourcePathTb4b4b4)
Tff7b72val Te6edf3raw Tff7b72= Te6edf3bytesTb4b4b4.Te6edf3decodeToStringTb4b4b4(Tb4b4b4)
Te6edf3stripFrontmatterTb4b4b4(Te6edf3rawTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ff# Tffd700${Te6edf3pageTb4b4b4.Te6edf3titleTffd700}Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnContent not available. The documentation file could not be loaded.Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffReturnCountTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffstripFrontmatterTb4b4b4(Te6edf3contentTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3contentTb4b4b4.Te6edf3startsWithTb4b4b4(Te6edf3FRONTMATTER_DELIMITERTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3content
Tff7b72val Te6edf3endIndex Tff7b72= Te6edf3contentTb4b4b4.Te6edf3indexOfTb4b4b4(Te6edf3FRONTMATTER_DELIMITERTb4b4b4, Te6edf3startIndex Tff7b72= Te6edf3FRONTMATTER_DELIMITERTb4b4b4.Te6edf3lengthTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3endIndex Tff7b72< T79c0ff0Tb4b4b4) Tff7b72return Te6edf3content
Tff7b72return Te6edf3contentTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3endIndex Tff7b72+ Te6edf3FRONTMATTER_DELIMITERTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffpagesBySectionTb4b4b4(Te6edf3sectionTb4b4b4: Te6edf3DocSectionTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72> Tff7b72=
Te6edf3lastPagesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3section Tff7b72=Tff7b72= Te6edf3section Tb4b4b4}Tb4b4b4.Te6edf3sortedWithTb4b4b4(Te6edf3compareByTb4b4b4(Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3navOrder Tb4b4b4}Tb4b4b4, Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3title Tb4b4b4}Tb4b4b4)Tb4b4b4)
T8b949e/** Parse a comma-separated keyword string resource value into a list. */
Tff7b72private Tff7b72fun Td2a8ffparseKeywordsTb4b4b4(Te6edf3csvTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3csvTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}
T8b949e// ---------------------------------------------------------------------------
T8b949e// User Guide index — titles and keywords from string resources (translatable)
T8b949e// ---------------------------------------------------------------------------
T8b949e/**
* Metadata for a user guide page. [titleRes] and [keywordsRes] are resolved at runtime from the device locale,
* allowing Crowdin translations to appear in the in-app TOC and search index.
*/
Tff7b72private Tff7b72data Tff7b72class T56d364UserPageDefTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3titleResTb4b4b4: Te6edf3StringResourceTb4b4b4,
Tff7b72val Te6edf3keywordsResTb4b4b4: Te6edf3StringResourceTb4b4b4,
Tff7b72val Te6edf3resourcePathTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3navOrderTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3aliasesTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tff7b72val Te6edf3charCountTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3iconIdTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3userPages Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_onboardingTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_onboardingTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/onboarding.htmlTa5d6ff"Tb4b4b4,
T79c0ff1Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirst-launchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsetupTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffintroTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffonboardingTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffconnectionsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_connectionsTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_connectionsTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/connections.htmlTa5d6ff"Tb4b4b4,
T79c0ff2Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffbluetoothTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffusbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpairingTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff1T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffconnectionsTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffmessages-and-channelsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_messagesTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_messagesTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/messages-and-channels.htmlTa5d6ff"Tb4b4b4,
T79c0ff3Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdirect-messagesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmessagingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconversationsTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff5T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffnodesTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_nodesTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_nodesTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/nodes.htmlTa5d6ff"Tb4b4b4,
T79c0ff4Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffnode-listTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmesh-nodesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnodesTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffnode-metricsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_node_metricsTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_node_metricsTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/node-metrics.htmlTa5d6ff"Tb4b4b4,
T79c0ff5Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmetricsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftelemetryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice-metricsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsignalTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff5T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnode-metricsTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffmap-and-waypointsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_mapTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_mapTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/map-and-waypoints.htmlTa5d6ff"Tb4b4b4,
T79c0ff6Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmapTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwaypointsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffgpsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocationTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff6T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffmapTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffsettings-radio-userTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_settings_radioTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_settings_radioTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/settings-radio-user.htmlTa5d6ff"Tb4b4b4,
T79c0ff7Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsettingsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffradio-configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffuser-configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffloraTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff6T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffsettings-radioTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffsettings-module-adminTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_settings_moduleTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_settings_moduleTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/settings-module-admin.htmlTa5d6ff"Tb4b4b4,
T79c0ff8Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmodulesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmodule-configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffadministrationTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff5T79c0ff5T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffsettings-moduleTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6fftelemetry-and-sensorsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_telemetryTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_telemetryTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/telemetry-and-sensors.htmlTa5d6ff"Tb4b4b4,
T79c0ff9Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsensorsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffenvironmentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffweatherTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpower-metricsTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftelemetryTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6fftakTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_takTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_takTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/tak.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff0Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fftakTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffatakTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffteam-awareness-kitTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff4T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftakTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffmqttTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_mqttTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_mqttTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/mqtt.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff1Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmqttTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinternet-bridgeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbrokerTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffmqttTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_discoveryTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_discoveryTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/discovery.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff2Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmesh-discoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocal-discoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnetwork-scanTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6fffirmwareTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_firmwareTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_firmwareTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/firmware.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff3Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirmwareTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffupdateTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffotaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffflashTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff4T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fffirmwareTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffdesktopTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_desktopTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_desktopTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/desktop.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff4Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffdesktopTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflinuxTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmacosTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwindowsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffjvmTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff9T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffdesktopTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffsignal-meterTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_signal_meterTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_signal_meterTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/signal-meter.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff5Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsignal-qualityTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsignal-strengthTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff5T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffsignal-meterTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffunits-and-localeTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_unitsTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_unitsTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/units-and-locale.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff6Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmeasurementTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunitsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocaleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmetricTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffimperialTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffunits-localeTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6fftranslateTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_translateTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_translateTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/translate.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff7Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffcrowdinTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocalizationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflanguageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffi18nTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontributeTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff7T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftranslateTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffandroid-autoTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_android_autoTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_android_autoTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/android-auto.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff8Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffandroid-autoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcarTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhead-unitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffautoTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff1T79c0ff1T79c0ff9Tb4b4b4,
Ta5d6ff"Ta5d6ffandroid-autoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffapp-functionsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_app_functionsTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_app_functionsTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/app-functions.htmlTa5d6ff"Tb4b4b4,
T79c0ff1T79c0ff9Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffapp-functionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsystem-aiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffgeminiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffassistantTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff7T79c0ff5T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffapp-functionsTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffwidgetTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_widgetTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_widgetTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/widget.htmlTa5d6ff"Tb4b4b4,
T79c0ff2T79c0ff0Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffwidgetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhome-screen-widgetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocal-stats-widgetTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff1T79c0ff7T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffwidgetTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffhelp-and-docsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_helpTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_helpTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/help-and-docs.htmlTa5d6ff"Tb4b4b4,
T79c0ff2T79c0ff1Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffhelpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdocs-browserTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffchirpyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffassistantTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff1T79c0ff9T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffhelpTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3UserPageDefTb4b4b4(
Ta5d6ff"Ta5d6ffdebug-logsTa5d6ff"Tb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_title_debug_logsTb4b4b4,
Te6edf3CoreResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3doc_keywords_debug_logsTb4b4b4,
Ta5d6ff"Ta5d6ffen/user/debug-logs.htmlTa5d6ff"Tb4b4b4,
T79c0ff2T79c0ff2Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffdebug-logsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflogcatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapp-logsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbug-reportTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffdebug-logsTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffbuildUserGuideIndexTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3KeywordIndexEntryTff7b72> Tff7b72= Te6edf3userPagesTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3def Tff7b72-Tff7b72>
Te6edf3KeywordIndexEntryTb4b4b4(
Te6edf3id Tff7b72= Te6edf3defTb4b4b4.Te6edf3idTb4b4b4,
Te6edf3title Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3defTb4b4b4.Te6edf3titleResTb4b4b4)Tb4b4b4,
Te6edf3section Tff7b72= Ta5d6ff"Ta5d6ffuserTa5d6ff"Tb4b4b4,
Te6edf3resourcePath Tff7b72= Te6edf3defTb4b4b4.Te6edf3resourcePathTb4b4b4,
Te6edf3navOrder Tff7b72= Te6edf3defTb4b4b4.Te6edf3navOrderTb4b4b4,
Te6edf3keywords Tff7b72= Te6edf3parseKeywordsTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3defTb4b4b4.Te6edf3keywordsResTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3aliases Tff7b72= Te6edf3defTb4b4b4.Te6edf3aliasesTb4b4b4,
Te6edf3charCount Tff7b72= Te6edf3defTb4b4b4.Te6edf3charCountTb4b4b4,
Te6edf3iconId Tff7b72= Te6edf3defTb4b4b4.Te6edf3iconIdTb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// ---------------------------------------------------------------------------
T8b949e// Developer Guide index — hardcoded English (code-focused, not translated)
T8b949e// ---------------------------------------------------------------------------
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffbuildDeveloperGuideIndexTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3KeywordIndexEntryTff7b72> Tff7b72= Te6edf3listOfTb4b4b4(
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffarchitectureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffArchitectureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/architecture.htmlTa5d6ff"Tb4b4b4,
T79c0ff1Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffarchitectureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkmpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflayerTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcoreTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffeatureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcomposeTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fflayersTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmodule-architectureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkmpTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff6T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffarchitectureTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffcodebaseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffCodebaseTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/codebase.htmlTa5d6ff"Tb4b4b4,
T79c0ff2Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffcodebaseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrepositoryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflayoutTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffgradleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbuildTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnamespaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconventionTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffrepository-layoutTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffproject-structureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsource-codeTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff7T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffcodebaseTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffadding-a-feature-moduleTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffAdding a Feature ModuleTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/adding-a-feature-module.htmlTa5d6ff"Tb4b4b4,
T79c0ff3Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffeatureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnewTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcreateTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpluginTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkoinTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffnew-moduleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffeature-moduleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmodule-guideTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffadding-featuresTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffnavigation-and-deep-linksTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffNavigation & Deep LinksTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/navigation-and-deep-links.htmlTa5d6ff"Tb4b4b4,
T79c0ff4Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffnavigationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeeplinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrouteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnavkeyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbackstackTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypedTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffdeeplinksTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnavigation-3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffroutesTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff4T79c0ff1T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnavigationTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffTransportTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/transport.htmlTa5d6ff"Tb4b4b4,
T79c0ff5Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffserialTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffradioTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconnectionTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffbleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffserialTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffradio-transportTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff0T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffpersistenceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffPersistenceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/persistence.htmlTa5d6ff"Tb4b4b4,
T79c0ff6Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatastoreTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprefsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmigrationTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdatastoreTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprefsTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff8T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpersistenceTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6fftestingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffTestingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/testing.htmlTa5d6ff"Tb4b4b4,
T79c0ff7Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffscreenshotTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcomposeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffroborazziTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffciTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fftestsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunit-testsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffscreenshot-testsTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff3T79c0ff1T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftestingTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffcontributingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffContributingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/contributing.htmlTa5d6ff"Tb4b4b4,
T79c0ff8Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffcontributingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpull-requestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbranchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffcontributingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpull-requestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbranch-namingTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff2T79c0ff9T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffcontributingTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3KeywordIndexEntryTb4b4b4(
Ta5d6ff"Ta5d6ffmeasurementTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffMeasurement & FormattingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeveloperTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffen/developer/measurement.htmlTa5d6ff"Tb4b4b4,
T79c0ff9Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffformatterTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmetricTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflocaleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftemperatureTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconversionTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapiTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffmetric-formatterTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnumber-formatterTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmeasurementTa5d6ff"Tb4b4b4)Tb4b4b4,
T79c0ff5T79c0ff4T79c0ff0T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffmeasurementTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Te6edf3KeywordIndexEntryTb4b4b4.Td2a8fftoDocPageTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3DocPage Tff7b72= Te6edf3DocPageTb4b4b4(
Te6edf3id Tff7b72= Te6edf3idTb4b4b4,
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3section Tff7b72= Te6edf3DocSectionTb4b4b4.Te6edf3fromStringTb4b4b4(Te6edf3sectionTb4b4b4)Tb4b4b4,
Te6edf3navOrder Tff7b72= Te6edf3navOrderTb4b4b4,
Te6edf3resourcePath Tff7b72= Te6edf3resourcePathTb4b4b4,
Te6edf3keywords Tff7b72= Te6edf3keywordsTb4b4b4,
Te6edf3aliases Tff7b72= Te6edf3aliasesTb4b4b4,
Te6edf3charCount Tff7b72= Te6edf3charCountTb4b4b4,
Te6edf3iconId Tff7b72= Te6edf3iconIdTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.16s